package com.jf.cloud.service.sysmanager.common.base;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.jf.cloud.service.sysmanager.common.db.Query;
import com.jf.cloud.service.sysmanager.common.taglib.Paging;

public interface IBaseService<T extends Serializable,PK extends Serializable> {
	/**
	 * 根据唯一索引（非主键）获取对象
	 */
	public T find(String colnumName, Object colnumValue);
	/**
	 * 根据条件  获取对象集合
	 */
	public List<T> findList(String colnumName, Object colnumValue);
	/**
	 * 查询对象集合,自定义查询字段
	 * key:字段名  value:别名
	 */
	public List<T> findList(Map<String, String> columns, Query query);
    /**
	 * 根据查询条件获取对象 集合
	 */
	public List<T> findList(Query query) ;
	/**
	 * 根据查询条件获取对象 单个
	 */
	public T find(Query query) ;
	/**
	 * 查询对象,自定义查询字段
	 * key:字段名  value:别名
	 */
	public T find(Map<String,String> columns, Query query);
	
	/**
	 * ★ Object 查询单个字段 返回 对象类型 如 分页的count int
	 */
	public <T> T findSingleColumnObject(Query query,Class<T> clazzType);
	/**
	 * 查询任意对象
	 * 按 主键查询 默认主键名称为 ROW_ID
	 */
	public T findByPK(PK pkId); 
	/**
	 * 任意对象的分页查询
	 */
	public Paging<T> findPage(Paging<T> page);
	/**
	 * 分页查询List,自定义查询字段
	 * key:字段名  value:别名
	 */
	public Paging<T> findPage(Map<String, String> columns, Paging<T> page);
	/**
	 * 查询Map
	 */
	public Map<String, Object> findMap(Map<String, String> columns, Query query);
	
	/**
	 * 查询Map
	 */
	public Map<String, Object> findMap(Query query);
	/**
	 * 查询Map List
	 */
	public List<Map<String, Object>> findMapList(Map<String, String> columns, Query query);
	
	/**
	 * 查询Map List
	 */
	public List<Map<String, Object>> findMapList(Query query);
    /**
     * 多条件查询 是否存在
     */
	public boolean isExist(Query query); 
	/**
	 * 多条件查询
	 * textColumn:显示的字段
	 * valColumn ：取值的字段
	 * query ： 查询条件
	 */
	public List<Map<String, Object>> findForTags(String textColumn,String valColumn,Query query);
	
	public int update(String sql, Object... args);
	
	public T saveObj(T obj);
	/**
	 * ★ 根据SQL语句及参数执行保存、更新或删除 【无事物，不关心结果的修改，有风险的】
	 */
	public int updateRisk(String sql, Object... args);

	/**
	 * 执行修改语句！返回执行结果 boolean (指定必须影响的行数)
	 * @param mustUpdateRecords 预期的执行影响条数 如果大于0 并且和执行结果不相等则抛出异常 (null 或者 0 则不做要求)
	 * @author 卫江波
	 * @2017年6月27日下午4:54:48
	 */
	public Boolean safeUpdate(String sql, int mustUpdateRecords, Object... args);
	
}
